package Clases;

import java.util.ArrayList;
import java.util.List;

public class Balde {

    private int id;
    int N;
    int j;
    private List<Direccion> baldesConocidos;
    private Diccionario diccionario;
    private int level;
    private int split;


    public void setLista(ArrayList<Direccion> listaNueva){
        this.baldesConocidos = listaNueva;
    }

    public List<Direccion> BaldesConocidos(){
        return this.baldesConocidos;
    }

    public Balde(int id) {
        this.id = id;
        N = 0;
        j = 0;
        baldesConocidos = LectorArchivos.ObtenerDireccionesServidores("src/ListaServidores.csv");
        baldesConocidos.remove(this.id);
        diccionario = Diccionario.Instancia();
        calcularLevelYSplit();      // En base a los servers conocidos se calcula el level y split
    }

    public Balde(int j, int n, List<Direccion> lista) {
        this.N = n;
        this.j = j;
        baldesConocidos = LectorArchivos.ObtenerDireccionesServidores("src/ListaServidores.csv");
        diccionario = Diccionario.Instancia();
        calcularLevelYSplit();      // En base a los servers conocidos se calcula el level y split
    }

    public Direccion devolverBaldeConocido(int rid){
        for(Direccion dir : baldesConocidos){
            if(dir.ID() == rid){
                return dir;
            }
        }
        return null;
    }


//    //Al dividir un balde, los RID pasan a otro server que esté corriendo
//    public void dividir(int nuevoN, ArrayList<Balde> nuevaLista) {
//        this.N = nuevoN;
//        this.lista = nuevaLista;
//        this.j += 1;
//    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public int getSplit() {
        return split;
    }

    public void setSplit(int split) {
        this.split = split;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


    /***
     *
     * Este método se encarga de calcular el Level y el Split a partir de la
     * cantidad de servidores conocidos que se obtienen de archivo
     */
    private void calcularLevelYSplit() {
        // 2^level+split = numeroServers
        int nroServers = this.baldesConocidos.size();
        double log2Servers = (Math.log(nroServers)/Math.log(2));
        this.level = (int)Math.floor(log2Servers);
        this.split = nroServers - (int)Math.pow(2, this.level);
    }
}
